/**
 * 获取和设置对象的值
 * @obj 要获取和设置值的对象
 * @path 对象的层层路径
 * @setValue 要设置的值
 * @defaultValue 获取值时，找不到时的默认值
 */
function objAttribute(obj, path, setValue, defaultValue) {
    if (!path) {
        return;
    };
    const pathGroup = Array.isArray(path) ? path : path.match(/([^[.\]])+/g);
    return pathGroup.reduce((prevObj, curKey, index) => {
        // console.log(prevObj, curKey, index)
        if (index == pathGroup.length - 1 && setValue) {
            prevObj[curKey] = setValue
            return obj
        }
        return prevObj && prevObj[curKey]
    }, obj) || defaultValue;
};

const obj1 = {
    a: {
        b: 2
    }
}
const obj2 = {
    a: [{
        bar: {
            c: 3
        }
    }]
}

const obj3 = [{
        b: 2
    },
    2
]

function _() {
    console.log.apply(window, arguments)
}

// objAttribute(obj1, 'a.b')
// 2
// objAttribute(obj2, 'a[0].bar.c')
// 3
// objAttribute(obj2, ['a', '0', 'bar', 'c'])
// 2
// objAttribute(obj1, 'a.bar.c', 'default')
// default
// objAttribute(obj1, 'a.bar.c', 'default')
// default



console.log(objAttribute('obj3', ['1', 'dj'], null, '=='))
console.log(objAttribute(obj3, ['1']))

console.log(objAttribute(obj3, ['1'], '===2342==='))
console.log(objAttribute(obj2, ['a', 0, 'bar'], '===2342==='))

console.log(obj1)